package cloud.maque.admin.impl;

import cloud.maque.admin.domain.entity.MqEnum;
import cloud.maque.admin.domain.entity.MqEnumField;
import cloud.maque.admin.domain.vo.EnumVo;
import cloud.maque.admin.mapper.MqEnumMapper;
import cloud.maque.admin.service.MqEnumFieldService;
import cloud.maque.admin.service.MqEnumService;
import cloud.maque.framework.common.request.PaginateDataResquest;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;

import java.util.ArrayList;
import java.util.List;

/**
 * @author zhuyf
 * @date 2023/3/16 21:19
 */
@Service
public class MqEnumServiceImpl extends ServiceImpl<MqEnumMapper, MqEnum> implements MqEnumService {

    @Autowired
    MqEnumFieldService fieldService;

    @Override
    public MqEnum saveEnum(MqEnum mqEnum) {

        Assert.hasText(mqEnum.getEnumValue(), "字典项目值不能为空");
        Assert.hasText(mqEnum.getEnumName(), "字典项名称不能为空");
        Assert.hasText(mqEnum.getFieldId(), "fieldId不能为空");

        MqEnumField field = fieldService.getById(mqEnum.getFieldId());
        if (field != null) {
            mqEnum.setFieldCode(field.getFieldCode());
        }

        saveOrUpdate(mqEnum);
        return mqEnum;
    }

    @Override
    public Integer countByField(String fieldId) {

        QueryWrapper<MqEnum> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda().eq(MqEnum::getFieldId, fieldId);
        return count(queryWrapper);
    }

    @Override
    public EnumVo Detail(String enumId, String fieldId) {

        EnumVo vo = new EnumVo();
        vo = vo.Convert(getById(enumId));

        if (!StrUtil.isEmptyIfStr(vo.getParentEnumId())) {
            //遍历查找父级ID
            List<String> parentIds = new ArrayList<>();
            if (!vo.getParentEnumId().equals("0")) {
                findParent(parentIds, vo.getParentEnumId());
            }
            vo.setParentEnumIds(parentIds);
        }

        if (vo.getFieldId() == null) {
            vo.setFieldId(fieldId);
        }
        vo.setMaxOrderChild(maxOrder(vo.getFieldId(), enumId));
        return vo;
    }

    private Integer maxOrder(String fieldId, String parentId) {

        QueryWrapper<MqEnum> queryWrapper = new QueryWrapper<>();
        queryWrapper.select("max(enum_order) enum_order");
        queryWrapper.lambda().eq(MqEnum::getFieldId, fieldId);
        queryWrapper.lambda().eq(MqEnum::getParentEnumId, parentId);
        MqEnum enum1 = getOne(queryWrapper);
        if (enum1 != null && enum1.getEnumOrder() != null) {
            return getOne(queryWrapper).getEnumOrder() + 1;
        } else {
            return 1;
        }
    }

    private void findParent(List<String> parentIds, String parentId) {

        MqEnum mqEnum = getById(parentId);
        if (mqEnum != null) {
            parentIds.add(0, parentId);
            if (!StrUtil.isEmptyIfStr(mqEnum.getParentEnumId()) && !mqEnum.getParentEnumId().equals("0")) {
                findParent(parentIds, mqEnum.getParentEnumId());
            }
        }
    }


    @Override
    public PageInfo<MqEnum> page(PaginateDataResquest<MqEnum> pageReq) {

        PageHelper.startPage(pageReq.getPageIndex(), pageReq.getPageSize());
        QueryWrapper<MqEnum> wrapper = new QueryWrapper<>();

        if (!StrUtil.isEmptyIfStr(pageReq.getData().getEnumName())) {
            wrapper.lambda().like(MqEnum::getEnumName, pageReq.getData().getEnumName());
        }

        if (!StrUtil.isEmptyIfStr(pageReq.getData().getEnumValue())) {
            wrapper.lambda().like(MqEnum::getEnumValue, pageReq.getData().getEnumValue());
        }

        if (!StrUtil.isEmptyIfStr(pageReq.getData().getParentEnumId())) {
            wrapper.lambda().eq(MqEnum::getParentEnumId, pageReq.getData().getParentEnumId());
        }

        if (!StrUtil.isEmptyIfStr(pageReq.getData().getFieldId())) {
            wrapper.lambda().eq(MqEnum::getFieldId, pageReq.getData().getFieldId());
        }

        if (!StrUtil.isEmptyIfStr(pageReq.getData().getTenantId())) {
            wrapper.lambda().eq(MqEnum::getTenantId, pageReq.getData().getTenantId());
        }

        wrapper.lambda().orderByAsc(MqEnum::getEnumOrder);
        wrapper.lambda().orderByAsc(MqEnum::getEnumId);
        List<MqEnum> departments = this.baseMapper.selectList(wrapper);
        PageInfo<MqEnum> pageInfo = new PageInfo<>(departments);

        return pageInfo;
    }

    @Override
    public Boolean deleteByIdAndTenantId(String enumId, String tenantId) {
        QueryWrapper<MqEnum> wrapper = new QueryWrapper<>();
        wrapper.lambda().eq(MqEnum::getTenantId, tenantId);
        wrapper.lambda().eq(MqEnum::getEnumId, enumId);
        return this.remove(wrapper);
    }


}
